# -*- coding: UTF-8 -*-
from datetime import date
from django.core.urlresolvers import reverse
from django.template import RequestContext
from django.http import HttpResponse #, Http404, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.mail import send_mail
from django.contrib.auth.decorators import login_required, user_passes_test
from django.db.models import Avg


#~ from django.core import serializers
#~ from django.contrib.auth.decorators import login_required 

#~ from django.core.paginator import Paginator, InvalidPage, EmptyPage
#~ from django.db.models import Q
#~ import time
#~ from django.utils.datastructures import SortedDict
#~ from django.utils.safestring import mark_safe
#~ from django.contrib.auth import logout



from avanza.avanzaweb.models import *
from avanza.avanzaweb.forms import *

#~ Decorador JSON

#~ from django.utils import simplejson
#~ from django.utils.translation import ugettext as _


#~ def json_view(func):
     #~ def wrap(request, *a, **kw):
          #~ response = ''
          #~ response = func(request, *a, **kw)
          #~ json = simplejson.dumps(response)
          #~ return HttpResponse(json, mimetype='application/json')
     #~ return wrap
#~ Fin decorador

def index(request):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F') .order_by('orden') 
     return render_to_response('inicio.html',{'fotosini': fotoini },context_instance=RequestContext(request))

def contenido(request, cn):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F') .order_by('orden') 
     fotos = Pagina_Media.objects.select_related().filter(pagina__nombre__exact = cn) .order_by('orden') 
     if fotos:
          pag = fotos[0].pagina
     else:
          pag = Pagina.objects.get(nombre = cn)
     content = ''
     clase = ''
     for c in Contenido.objects.filter(pagina = pag.id).order_by('orden'):
          content += c.texto
          clase +=  ' ' + c.clase_css
     return render_to_response('contenido.html',{'titulo':  pag.titulo, 'content': content, 'fotos': fotos, 'fotosini': fotoini, 'clase': clase},context_instance=RequestContext(request))
          
def frmContacto(request):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F') .order_by('orden') 
     fotos = Pagina_Media.objects.select_related().filter(pagina__nombre__exact = 'contacto') .order_by('orden') 
     retorno = ''
     if fotos:
          pag = fotos[0].pagina
     else:
          pag = Pagina.objects.get(nombre = 'contacto')
     
     content = ''
     for c in Contenido.objects.filter(pagina = pag.id).order_by('orden'):
          content += c.texto

     if request.method == 'POST': 
          form = ContactForm(request.POST) 
          if form.is_valid(): 
               from settings import DESTINO_EMAIL
               send_mail('Petición de información', request.POST['texto'], request.POST['de'], DESTINO_EMAIL)
               retorno = 'Correcto'
          else:
               retorno = 'Errores'
     else:
          form = ContactForm()

     return render_to_response('corpform.html',{'retorno': retorno,'form': form, 'titulo':  pag.titulo, 'content': content, 'fotos': fotos, 'fotosini': fotoini},context_instance=RequestContext(request))

def promocion(request, pr, pdf=False):
     fotos = Promocion_Media.objects.select_related().filter(promocion = pr) .order_by('orden')
     if fotos:
          promo = fotos[0].promocion
     else:
          promo = Promocion.objects.get(id = pr)
     lugar = promo.direccion + ' ' + promo.localidad + ' ' + promo.cp
     if pdf:
          from django.template.loader import render_to_string
          mapa = mapa_img(promo.lat, promo.lng)       
          html = render_to_string('promo_pdf.html', {'pagesize':'A4', 'nombre': promo.nombre, 'descripcion': promo.descripcion, 'mapa': mapa, 'memoria': promo.memoria, 'fotos': fotos},context_instance=RequestContext(request))
          return generar_pdf(html)     
          #~ return render_to_response('promo_pdf.html', {'pagesize':'A4', 'nombre': promo.nombre, 'descripcion': promo.descripcion, 'mapa': mapa, 'memoria': promo.memoria, 'fotos': fotos},context_instance=RequestContext(request))
     else:
          return render_to_response('promo.html',{'promo': promo.id, 'nombre': promo.nombre, 'descripcion': promo.descripcion, 'lugar': lugar, 'memoria': promo.memoria, 'fotos': fotos, 'vigente': promo.vigente},context_instance=RequestContext(request))

@login_required
@user_passes_test(lambda u: u.is_active)
def cuestionario(request, pr=None):     
     if pr == None:
          return index(request)
     else:
          promo = Promocion.objects.get(id = pr)
          if promo.fecha > date.today():
               return render_to_response('cuestionario.html',{'next': reverse(index), 'resultado': 'Esta encuesta ha superado su período de vigencia.'},context_instance=RequestContext(request))
          if Survey.objects.filter(ip__exact = request.META['REMOTE_ADDR']):
               return render_to_response('cuestionario.html',{'next': reverse(index), 'resultado': 'Ya hay registrada una encuesta desde este origen.'},context_instance=RequestContext(request))
          sur = Survey()
          if request.method == 'POST': 
               from django.contrib.auth.models import User
               from django.contrib.auth import logout
               usuario = request.user
               sur.fecha = date.today()
               sur.promocion = promo
               sur.ip = request.META['REMOTE_ADDR']
               form = SurveyForm(request.POST, instance = sur)
               if form.is_valid():
                    form.save()
                    if not usuario.is_superuser:
                         usuario.is_active = False
                         usuario.save()
                         logout()
                    return render_to_response('cuestionario.html',{'form': form, 'next': reverse(index), 'resultado': 'Gracias por completar nuestra encuesta.'},context_instance=RequestContext(request))
          else:
               form = SurveyForm(instance = sur)
          return render_to_response('cuestionario.html',{'form': form, 'next': '', 'resultado': ''},context_instance=RequestContext(request))

def estadistica(request):
     cn = 'clientes'
     est = Survey.objects.filter(publicada = True).aggregate(Avg('satis_plan'), Avg('trato'), Avg('satis_plan'), Avg('satis_viv'), Avg('posventa'), Avg('calidad_precio'))
     fotoini = Media.objects.filter(inicial = True, tipo = 'F') .order_by('orden') 
     fotos = Pagina_Media.objects.select_related().filter(pagina__nombre__exact = cn) .order_by('orden') 
     comentarios = Survey.objects.filter(pub_comentario = True).values('comentario')
     if fotos:
          pag = fotos[0].pagina
     else:
          pag = Pagina.objects.get(nombre = cn)
     content = u'<div  style="width:97%; text-align: center"><a href="' + reverse(cuestionario) + u'" title="Acceder a zona de clientes">Acceso zona clientes</a><br/><hr style="width: 50%; margin: 5px auto;"/></div>'
     if est['trato__avg']:
          content += u'<div>Esto es lo que opinan los clientes de Avanza Promociones</div>'
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Trato recibido: %s sobre 10</div></div>'%(est['trato__avg'] * 10-1,  rgb(est['trato__avg']), int(est['trato__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Satisfacción vivienda: %s sobre 10</div></div>'%(est['satis_viv__avg'] * 10-1, rgb(est['satis_viv__avg']) , int(est['satis_viv__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Trato postventa: %s sobre 10</div></div>'%(est['posventa__avg'] * 10-1,  rgb(est['posventa__avg']) ,int(est['posventa__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Satisfacción calidad-precio: %s sobre 10</div></div>'%(est['calidad_precio__avg'] * 10-1,  rgb(est['calidad_precio__avg']), int(est['calidad_precio__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Plan financiación: %s sobre 10</div></div><br/>'%(est['satis_plan__avg'] * 10-1,  rgb(est['satis_plan__avg']), int(est['satis_plan__avg']))
     if comentarios:
          content += '<div>Comentarios</div>'
     for com in comentarios:
          content += u'<div class="comment">&quot;' + com['comentario'] + u'&quot;</div><hr style="width: 20%; margin: 5px auto;" />'
     clase = ''     
     return render_to_response('contenido.html',{'titulo':  pag.titulo, 'content': content, 'fotos': fotos, 'fotosini': fotoini, 'clase': clase},context_instance=RequestContext(request))
       

####PDF
def generar_pdf(html):
     import cStringIO as StringIO
     import ho.pisa as pisa
     import cgi
     # Función para generar el archivo PDF y devolverlo mediante HttpResponse
     result = StringIO.StringIO()
     pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
     if not pdf.err:
          return HttpResponse(result.getvalue(), mimetype='application/pdf')
     return HttpResponse('Error al generar el PDF: %s' % cgi.escape(html))


def geocode(direccion):
     import simplejson, urllib2, cgi
     url = 'http://maps.google.com/maps/api/geocode/json?address=%s&sensor=false' % direccion.replace(' ','+').encode('utf-8') #(' ', '+')
     result=simplejson.load(urllib2.urlopen(url))
     if result['status'] == 'OK':
          return [result['results'][0]['geometry']['location']['lat'], result['results'][0]['geometry']['location']['lng']]
     else:
          return [0,0]
          
def mapa_img(lat, lng):
     from settings import MAPS_API_KEY
     url = 'http://maps.google.com/staticmap?center=%s,%s&zoom=14&size=600x300&key=%s&markers=%s,%s&sensor=false'%(lat, lng, MAPS_API_KEY, lat, lng)
     return retrieve(url)

def retrieve(url):
     import tempfile
     import pycurl
     f = tempfile.NamedTemporaryFile(suffix = '.gif', delete=False)
     filename = f.name
     c = pycurl.Curl()
     c.setopt(pycurl.URL, str(url))
     c.setopt(pycurl.WRITEFUNCTION, f.write)
     try:
          c.perform()
     except:
          filename = None
     finally:
          c.close()
          f.close()
     print filename
     return filename
     
def rgb(num):
     num = int(num)
     r=str(155+(num * 10))
     g=str(255-num*10)
     b=str(100 +(255-num*10))
     return r+','+g+','+b
     